package com.grandtech.insurance.common;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by zy on 2017/1/20.
 * 反射帮助
 */

public final class ReflectUtil {

    private ReflectUtil() {
    }


    public static List<Field> getIterationFields(Class clazz) {
        List<Field> fields = new ArrayList<>();
        Class tempClass = clazz;
        while (tempClass != null && !tempClass.getName().toLowerCase().equals("java.lang.object")) {
            fields.addAll(Arrays.asList(tempClass.getDeclaredFields()));
            tempClass = tempClass.getSuperclass();
        }
        return fields;
    }


    /**
     * 获取get方法名称
     *
     * @param field
     * @return
     */
    public static String getMethodName(Field field) {
        String fieldName = field.getName();
        String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字
        String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法的名字
        return getMethodName;
    }

    /**
     * 获取set方法名称
     *
     * @param field
     * @return
     */
    public static String setMethodName(Field field) {
        String fieldName = field.getName();
        String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字
        String setMethodName = "set" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法的名字
        return setMethodName;
    }

    /**
     * 获取get方法名称
     *
     * @param field
     * @return
     */
    public static String getMethod(Field field) {
        String fieldName = field.getName();
        String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字
        String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法的名字
        return getMethodName;
    }

    /**
     * 获取set方法名称
     *
     * @param field
     * @return
     */
    public static Method setMethod(Class<?> clazz, Field field) {
        Method setMethod = null;
        try {
            String setMethodName = setMethodName(field);
            Class[] parameterTypes = new Class[1];
            parameterTypes[0] = field.getType();
            setMethod = clazz.getMethod(setMethodName, parameterTypes);
        } catch (Exception e) {
//            e.printStackTrace();
            setMethod = null;
        }
        return setMethod;
    }

    public static Method getMethod(Class<?> clazz, Field field) {
        Method getMethod = null;
        try {
            String getMethodName = getMethodName(field);
            getMethod = clazz.getMethod(getMethodName, new Class[]{});
        } catch (Exception e) {
            e.printStackTrace();
            getMethod = null;
        }
        return getMethod;
    }
//
//    /**
//     * 通过反射获取表名
//     *
//     * @param clazz
//     * @return
//     */
//    public static String getTableName(Class<?> clazz) {
//        Table table = clazz.getAnnotation(Table.class);
//        String tableName = table.name();
//        if (tableName.equals("default")) {
//            tableName = clazz.getSimpleName();
//        }
//        return tableName;
//    }
//
//    /**
//     * 给类，和属性 获取 列名
//     *
//     * @param clazz
//     * @param attributeName
//     * @return
//     */
//    public static String getColumnName(Class<?> clazz, String attributeName) {
//        try {
//            String simpleClassName = clazz.getSimpleName();
//            Field field = clazz.getDeclaredField(attributeName);
//            if (field != null) {
//                return getColumnName(field);
//            } else {
//                return attributeName;
//            }
//        } catch (Exception e) {
//            System.out.println(e.getMessage());
//            return attributeName;
//        }
//    }

}
